package org.noear.quarkus;


import io.quarkus.runtime.StartupEvent;
import io.vertx.core.AbstractVerticle;
import io.vertx.ext.web.Router;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.inject.Inject;
import org.noear.quarkus.tool.McpServerTool2;
import org.noear.solon.Solon;
import org.noear.solon.ai.chat.tool.MethodToolProvider;
import org.noear.solon.ai.mcp.McpChannel;
import org.noear.solon.ai.mcp.server.McpServerEndpointProvider;
import org.noear.solon.ai.mcp.server.prompt.MethodPromptProvider;
import org.noear.solon.ai.mcp.server.resource.MethodResourceProvider;
import org.noear.solon.web.vertx.VxWebHandler;


@ApplicationScoped
public class McpServerConfig extends AbstractVerticle {
    @Inject
    Router router;

    private McpServerEndpointProvider endpointProvider;
    VxWebHandler handler = new VxWebHandler();
    void onStart(@Observes StartupEvent ev) {

        router.routeWithRegex("/mcp/.*").handler(req -> {
              // 我感觉这个对象里的构建方式，会无法正常响应，概率性出在反射对象上
            handler.handle(req.request());
        });
        // 启动 Solon 应用，它将启动自己的 Web 服务器来处理 MCP 请求
        // 注意：这里 Solon 会占用一个端口（由 mcpserver.yml 或其他 Solon 配置指定）
        Solon.start(McpServerConfig.class, new String[]{"--cfg=mcpserver.yml"}, app -> {
            // 可以在这里为 Solon 应用添加 MCP 相关的过滤器或配置
            app.filter(new McpServerAuth()); // 如果这个过滤器是 Solon 兼容的
        });

        // 构建并配置 MCP 服务端点 *在 Solon 应用内部*
        // 注意：endpointProvider 的 postStart() 应该在 Solon 应用上下文中执行
        // 这通常意味着 McpServerEndpointProvider 的实现需要与 Solon 的 Web 服务器集成
        endpointProvider = McpServerEndpointProvider.builder()
                .name("McpServerTool2")
                .channel(McpChannel.SSE)
                .sseEndpoint("/mcp/demo2/sse") // 这个端点将由 Solon 应用提供服务
                .build();
        endpointProvider.addTool(new MethodToolProvider(new McpServerTool2()));
        endpointProvider.addResource(new MethodResourceProvider(new McpServerTool2()));
        endpointProvider.addPrompt(new MethodPromptProvider(new McpServerTool2()));

        // 确保在 Solon 应用完全启动后，再进行 postStart
        // 如果 postStart 需要与 Solon 的 Web 服务器关联，确保它在 Solon 启动之后执行
        endpointProvider.postStart();

        // 注册到 Solon 容器，而不是 Quarkus
        Solon.context().wrapAndPut(endpointProvider.getName(), endpointProvider);

        System.out.println("Solon MCP Server started.");
    }

    @Override
    public void start() {
        // Quarkus 生命周期管理会自动调用 onStart
    }

    @Override
    public void stop() {
        if (Solon.app() != null) {
            Solon.stopBlock(false, Solon.cfg().stopDelay());
        }
    }
}